From: Ivan Molodetskikh Date: Sat, 27 Feb 2021 06:59:21 +0000 (+0300) Subject: workspace: Check if index is valid before using it X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~173 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=35fb221a7ea99cbc0a7f50782c2b52ab461a21ab;p=gnome-shell.git workspace: Check if index is valid before using it If the window wasn't in _windowSlots, the index is -1, so the last element of the array is removed, leading to https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3547 I logged the stack trace from removeWindow() and it seems that when you move the window from the second monitor to another workspace like shown in https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3547, removeWindow() is called twice for it, presumably once for the second monitor workspace, and then once for the first monitor workspace for some reason. It is during that call that _windowSlots doesn't contain the window, so instead the last element (index -1) is removed, leading to the animation bug. Part-of: --- diff --git a/js/ui/workspace.js b/js/ui/workspace.js index a21b5b43c..4fa113bac 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -784,8 +784,9 @@ var WorkspaceLayout = GObject.registerClass({ // The layout might be frozen and we might not update the windowSlots // on the next allocation, so remove the slot now already - this._windowSlots.splice( - this._windowSlots.findIndex(s => s[4] === window), 1); + const index = this._windowSlots.findIndex(s => s[4] === window); + if (index !== -1) + this._windowSlots.splice(index, 1); // The window might have been reparented by DND if (window.get_parent() === this._container)